﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Viettel.VOFFICE.DAO.DAL.Paging;
using Viettel.VOFFICE.DAO.Enums;
using Viettel.VOFFICE.DAO.Models;

namespace Viettel.VOFFICE.DAO.DAL.Repository
{
    /// <summary>
    /// xử lý việc lưu trữ các thuộc tính của công văn
    /// thuộc tính được lưu và mở rộng tại đây
    /// </summary>
    public class DocumentPropertyRepository : IRepository<DocumentProperty>
    {
        private VOFFICEContext context;
        public DocumentPropertyRepository(VOFFICEContext context)
        {
            if (context == null)
            {
                throw new Exception("Context must be init");
            }
            this.context = context;
        }
        public IEnumerable<DocumentProperty> Get()
        {
            return context.DocumentProperties.Select(o => o);
        }

        public DocumentProperty GetById(object id)
        {
            return context.DocumentProperties.Find(id);
        }
        public IEnumerable<DocumentProperty> Search(string key)
        {
            return context.DocumentProperties.Where(o => o.Name.Contains(key)).OrderByDescending(o => o.UpdatedAt);
        }

        public IEnumerable<DocumentProperty> FindByName(object s)
        {
            throw new NotImplementedException();
        }

        public void Insert(DocumentProperty T)
        {
            if (T != null)
            {
                context.DocumentProperties.Add(T);
                Save();
            }
        }

        public void Delete(object id)
        {
            var item = GetById(id);
            if (item != null)
            {
                context.DocumentProperties.Attach(item);
                context.DocumentProperties.Remove(item);
                Save();
            }
        }

        public void Delete(DocumentProperty T)
        {
            if (T != null)
            {
                context.DocumentProperties.Attach(T);
                context.DocumentProperties.Remove(T);
                Save();
            }
        }

        public void Update(DocumentProperty T)
        {
            if (T != null)
            {
                context.Entry(T).State = EntityState.Modified;
                Save();
            }
        }

        public void Save()
        {
            context.SaveChanges();
        }

        public PagedList<DocumentProperty> Paging(int pageIndex, int pageSize)
        {
            return context.DocumentProperties.OrderByDescending(o => o.Id).Paginate<DocumentProperty>(pageIndex, pageSize);
        }

        /// <summary>
        /// Lấy toàn bộ một thuộc tính bởi type truyền vào
        /// </summary>
        /// <param name="dpType"></param>
        /// <param name="isActive"></param>
        /// <returns></returns>
        public IEnumerable<DocumentProperty> GetByType(DocPropertyType dpType, bool? isActive = true)
        {
            return context.DocumentProperties.Where(o => o.Type == (int)dpType && o.IsActive == isActive).OrderByDescending(o => o.IsDefault);
        }
    }
}
